package cn.darkhorse.api;

import cn.darkhorse.exception.InteractionFailedException;

import java.util.List;
import java.util.Map;

/**
 * 提供和activiti交互的方法
 * @author yuanjun
 * @since 2020/5/28 9:09
 */
public interface IActivitiService {

    /**
     * 开始一个流程实例
     * @param processKey 工作流key，对应bpmn_workflow表中的 process_key
     * @param businessKey 业务id，对应业务表单的id
     * @return 返回实例ID 类型: varchar(64)
     * @throws InteractionFailedException
     */
    String startProcessInstanceByKey(String processKey, String businessKey) throws InteractionFailedException;

    /**
     * 开始一个流程实例
     * @param processKey 工作流key，对应bpmn_workflow表中的 process_key
     * @param businessKey 业务id，对应业务表单的id
     * @param variables 参数
     * @return 返回实例ID 类型: varchar(64)
     * @throws InteractionFailedException
     */
    String startProcessInstanceByKey(String processKey, String businessKey, Map<String, Object> variables) throws  InteractionFailedException;

    /**
     * 查询某个用户的所有任务
     * @param userName
     * @return 任务列表 List<BusinessTaskDTO>
     * @throws InteractionFailedException
     */
    List<BusinessTaskDTO> queryBusinessTasksByUserName(String userName) throws InteractionFailedException;

    /**
     * 查询某个实例下某个用户的所有任务
     * @param userName 用户名
     * @param processId 流程实例Id
     * @return 任务列表 List<BusinessTaskDTO>
     * @throws InteractionFailedException
     */
    List<BusinessTaskDTO> queryBusinessTasksByUserNameAndProcessId(String userName, String processId) throws InteractionFailedException;

    /**
     * 查询某个分组(岗位)对应的所有任务
     * @param candidateGroups 候选组的名称
     * @return 任务列表 List<BusinessTaskDTO>
     * @throws InteractionFailedException
     */
    List<BusinessTaskDTO> queryBusinessTasksByGroups(List<String> candidateGroups) throws InteractionFailedException;

    /**
     * 删除流程实例
     * @param processInstanceId 流程实例id
     * @param deleteReason 删除原因
     * @return 成功 true ，失败false
     * @throws InteractionFailedException
     */
    void deleteProcessInstanceById(String processInstanceId, String deleteReason) throws InteractionFailedException;

    /**
     * 判断流程是否已经结束
     * @param processInstanceId
     * @return 结束/true 未结束/false
     * @throws InteractionFailedException
     */
    Boolean processIsOverById(String processInstanceId) throws InteractionFailedException;

    /**
     * 同意操作
     * @param taskId 对应BusinessTaskDTO#taskId
     * @throws InteractionFailedException
     */
    void agree(String taskId) throws InteractionFailedException;

    /**
     * 不同意操作
     * @param taskId 对应BusinessTaskDTO#taskId
     * @throws InteractionFailedException
     */
    void disagree(String taskId) throws InteractionFailedException;

    /**
     * 驳回
     * @param taskId 对应BusinessTaskDTO#taskId
     * @throws InteractionFailedException
     */
    void reject(String taskId) throws InteractionFailedException;

    /**
     * 签收
     * 如果是抢占任务谁签收，任务归谁处理
     * @param taskId 对应BusinessTaskDTO#taskId
     * @param userName
     * @throws InteractionFailedException
     */
    void claim(String taskId, String userName) throws InteractionFailedException;

    /**
     * 创建用户
     * @param userName 用户名，和业务系统中的user_name对应
     * @throws InteractionFailedException
     */
    void createUser(String userName) throws InteractionFailedException;
    void deleteUser(String userName) throws InteractionFailedException;

    /**
     * 创建用户组
     * @param groupId 用户组ID（对应业务系统的岗位编码）
     * @param groupName 用户组的名称（组名称的中文描述）
     * @throws InteractionFailedException
     */
    void createGroup(String groupId, String groupName) throws InteractionFailedException;
    void deleteGroup(String groupId) throws InteractionFailedException;

    /**
     * 把用户和组关联起来
     * @param userName 用户名，和业务系统中的user_name对应
     * @param groupId 用户组
     * @throws InteractionFailedException
     */
    void createMemberShip(String userName, String groupId) throws InteractionFailedException;
    void deleteMemberShip(String userName, String groupId) throws InteractionFailedException;
    
    /**
     * 转办
     * @param taskId
     * @param userName
     * @throws InteractionFailedException
     */
    void transferTask(String taskId,String userName) throws InteractionFailedException;
    
}
